from openpyxl import load_workbook

from algorithm.propagation_model.IC_model import ICModel
from algorithm.seed_nodes.community_PR import community_PR


def diploma_CODEG(G, communities, k=1):
    # 计算节点度
    degree_dict = dict(G.degree())
    # 按度排序
    seed_nodes = sorted(degree_dict, key=degree_dict.get, reverse=True)
    # 加载工作簿
    wb = load_workbook('output/diploma.xlsx')
    # 选择要操作的工作表
    ws = wb['COBase']
    for i in range(1, 6):
        # 使用基于社区划分和IC模型的种子节点选择算法选择种子节点
        seed_size = i * k
        seed_set = community_PR(communities, seed_size, seed_nodes)
        # 使用选取的种子节点进行信息传播并输出影响力
        model = ICModel(G)
        influence = model.simulate(seed_set, 0.1)
        data = len(influence)
        print(f"CODEG算法的种子节点个数为{seed_size},该组种子节点的影响力为{data}")
        # 要添加数据的单元格
        # 在10个种子节点行，数据集1的PageRank列下添加数据，那么该单元格坐标应该是B3
        cell = ws.cell(row=i + 2, column=2)
        # 添加数据
        cell.value = data
    # 保存更改
    wb.save('output/diploma.xlsx')
